package com.zzyl.utils;

/**
 * 工具类，创建编号
 */
public class NoProcessing {

    /*
     * 所有编号都是15位，共5层，每层关系如下：
     * 第一层：100000000000000
     * 第二层：100001000000000
     * 第三层：100001001000000
     * 第四层：100001001001000
     * 第五层：100001001001001
     *
     * 规则说明：
     * 1. 每个编号固定为 15 位。
     * 2. 每 3 位为一个层级，子部门编号在上级编号基础上增加有效数字，后续用 "000" 补全。
     * 3. 例如：
     *    - 第一层编号：100000000000000
     *    - 第二层编号：100001000000000（在第一层编号基础上，倒数第2组 "000" 替换为 "001"）
     *    - 第三层编号：100001001000000（在第二层编号基础上，倒数第1组 "000" 替换为 "001"）
     */


    /**
     * 处理编号：将其末尾的 "000" 字符串去掉，直到不再有 "000" 为止。
     *
     * @param input 输入编号
     * @return 修改后的编号
     */
    public static String processString(String input) {
        // 计算编号中 "000" 的组数（每 3 位为一组）
        int step = input.length() / 3;
        // 按组检查编号，移除末尾的 "000"
        for (int i = 0; i < step; i++) {
            // 获取编号的最后 3 位
            String targetString = input.substring(input.length() - 3, input.length());
            // 如果末尾是 "000"，移除
            if ("000".equals(targetString)) {
                input = input.substring(0, input.length() - 3);
            } else {
                // 如果不再是 "000"，停止处理
                break;
            }
        }
        return input;
    }

    /**
     *  生成层级编号
     * @param input 输入编号
     * @param peerNode 是否新增同级节点
     * @return 新生成的编号
     */
    public static String createNo(String input, boolean peerNode) {
        // 计算编号中 "000" 的组数（每 3 位为一组）
        int step = input.length() / 3;
        int supplement = 0; // 记录移除了多少组 "000"

        // 按组检查编号，移除末尾的 "000" 并记录移除的组数
        for (int i = 0; i < step; i++) {
            String targetString = input.substring(input.length() - 3, input.length());
            if ("000".equals(targetString)) {
                input = input.substring(0, input.length() - 3); // 移除末尾的 "000"
                supplement++;
            } else {
                break;
            }
        }

        // 根据是否新增同级节点（peerNode）生成编号
        if (peerNode) {
            // 新增同级节点：编号加 1
            input = String.valueOf(Long.valueOf(input) + 1L);

            // 将之前移除的 "000" 补回
            for (int i = 0; i < supplement; i++) {
                input = input + "000";
            }
        } else {
            // 新增下级节点：在编号后追加 "001"
            input = String.valueOf(Long.valueOf(input + "001"));

            // 补回之前移除的 "000"（减 1，因为新增下级节点会占用一组）
            for (int i = 0; i < supplement - 1; i++) {
                input = input + "000";
            }
        }

        return input;
    }

}
